"""
3152. 特殊数组 II
中等
相关标签
premium lock icon
相关企业
提示
如果数组的每一对相邻元素都是两个奇偶性不同的数字，则该数组被认为是一个 特殊数组 。

你有一个整数数组 nums 和一个二维整数矩阵 queries，对于 queries[i] = [fromi, toi]，请你帮助你检查 子数组 nums[fromi..toi] 是不是一个 特殊数组 。

返回布尔数组 answer，如果 nums[fromi..toi] 是特殊数组，则 answer[i] 为 true ，否则，answer[i] 为 false 。



示例 1：

输入：nums = [3,4,1,2,6], queries = [[0,4]]

输出：[false]

解释：

子数组是 [3,4,1,2,6]。2 和 6 都是偶数。

示例 2：

输入：nums = [4,3,1,6], queries = [[0,2],[2,3]]

输出：[false,true]

解释：

子数组是 [4,3,1]。3 和 1 都是奇数。因此这个查询的答案是 false。
子数组是 [1,6]。只有一对：(1,6)，且包含了奇偶性不同的数字。因此这个查询的答案是 true。


提示：

1 <= nums.length <= 105
1 <= nums[i] <= 105
1 <= queries.length <= 105
queries[i].length == 2
0 <= queries[i][0] <= queries[i][1] <= nums.length - 1
"""
from typing import List


class Solution:
    def isArraySpecial(self, nums: List[int], queries: List[List[int]]) -> List[bool]:
        #思路，记录异常点，求的是异常点的前缀和，当满足pre[r] - pre[l - 1] == 0 说是是true
        # dp = [0]
        preDp = [0]
        for i in range(1,len(nums)):
            if (nums[i] &1) != (nums[i-1] & 1):
                # dp.append(0)
                preDp.append(preDp[-1])
            else:
                # dp.append(1)#异常点
                preDp.append(preDp[-1] + 1)
        print(preDp)
        ans = []
        for l,r in queries:
            #注意l不需要-1，主要是最左也是异常点，那么他也要减去，因为截取后左侧没有数字了
            if preDp[r] - preDp[l]==0:
                ans.append(True)
            else:
                ans.append(False)
        return ans
if __name__ == '__main__':
    solution = Solution()
    # print(solution.isArraySpecial([3,4,1,2,6],[[0,4]]))
    print(solution.isArraySpecial( [4,3,1,6], [[0,2],[2,3]])) #[false,true]
    print(solution.isArraySpecial( [1], [[0,0]])) #[false,true]





